/*使用malloc(memory allocate)函数分配内存
void* malloc(size_t);
size_t--> 需要多少字节的空间
void* --> 返回指针类型(内存地址)，void表示通用数据类型指针
接到返回值后，需要强制类型转换
成功后返回内存地址，失败返回NULL（空指针）
使用free(memory free)函数释放内存
*/
#include <stdio.h>
#include <stdlib.h> //标准库(standard library)，malloc函数
#include <string.h>

int main()
{
    //动态内存分配--基本数据类型
    int *p = (int*)malloc(sizeof(int));
    if(p == NULL)
    {
        printf("malloc failed\n");
        return -1;
    }
    *p = 100;
    printf("*p = %d\n",*p);
    free(p);//记得一定要释放内存

    //动态内存分配--字符串类型（字符类型的数组）
    char *s;//字符串、数组类型的不需要加[]，根据指针、地址来访问
    s = (char*)malloc(sizeof(char)*10);
    strcpy(s,"hello"); //将字符串直接赋值给字符型变量，库函数
    printf("s = %s\n",s);
    free(s);

    //动态内存分配--数组类型
    int *arr = (int*)malloc(sizeof(int)*5);
    for(int i = 0; i < 5; i++)
    {
        arr[i] = i;
    }
    for(int i = 0; i < 5; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    free(arr);

    //动态内存分配--结构体类型
    typedef struct
    {
        int a;
        char b;
    }pi;
    printf("sizeof(pi) = %d\n",sizeof(pi));

    typedef struct student
    {
        char name[20];
        int age;
        float score;
    }po;
    printf("sizeof(po) = %d\n",sizeof(po));

    po *stu = (po*)malloc(sizeof(po));
    stu->age = 20;
    strcpy(stu->name,"zhangsan");
    stu->score = 100.0;
    
    printf("stu->name = %s\n",stu->name);
    printf("stu->age = %d\n",stu->age);
    printf("stu->score = %.2f\n",stu->score);
    free(stu);

    return 0;
}